package com.zty.redis.init;

import com.zty.redis.util.SpringContextUtil;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @Author ZTY
 * @Description 当项目启动时，要去做的事
 * @Date 3:35 2023-12-13
 **/

@Component
public class InitCache implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {

        //  打印文字到控制台
        System.out.println("项目启动了！");

        //  将缓存加载进来
        //  首先要取Spring容器中的整体的Context对象，知道Spring容器中哪些缓存要进行预热
        ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();

        //  根据type拿到相关的东西，根据类型获取Spring容器中的bean
        Map<String, AbstractCache> beanMap = applicationContext.getBeansOfType(AbstractCache.class);

        //  调用对应的init方法
        if (beanMap.isEmpty()) {
            return;
        }

        //  遍历需要预热的类
        for (Map.Entry<String, AbstractCache> entry : beanMap.entrySet()) {
            AbstractCache abstractCache = (AbstractCache) SpringContextUtil.getBean(entry.getValue().getClass());
            abstractCache.initCache();
        }
    }
}
